//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#ifndef _CCONFSERVER_H_
#define _CCONFSERVER_H_

class CConfServer : public dbus::CObject<CConfServer>
{
public:
    CConfServer();
    ~CConfServer();
    
private:
////////////////////////
// database functions
//
    void InitDatabase();
    void OpenDatabase();
    void PrepareQueries();

////////////////////////
// data functions
//
    int GetFolderID(const std::string &pFolder,bool pCreate=false);
    int CreateFolder(const std::string &pFolder);
    UValue GetValue(const dbus::CPath &pPath,const std::string &pKey);
    std::vector<std::string> GetKeyList(const dbus::CPath &pPath);
    std::map<std::string,UValue> GetKeyValueList(const dbus::CPath &pPath);
    void SetValue(const dbus::CPath &pPath,const std::string &pKey,const UValue &pValue);

//dbus functions
public:
    template <class tIntrospector>
    static void Introspect(tIntrospector &pI)
    {
        pI.template AddMethod<UValue(const dbus::CPath&,const std::string&)>("GetValue",&CConfServer::GetValue);
        pI.template AddMethod<std::vector<std::string>(const dbus::CPath&)>("GetKeyList",&CConfServer::GetKeyList);
        pI.template AddMethod<std::map<std::string,UValue>(const dbus::CPath&)>("GetKeyValueList",&CConfServer::GetKeyValueList);
        pI.template AddMethod<void(const dbus::CPath&,const std::string&,const UValue&)>("SetValue",&CConfServer::SetValue);
    }

//data
	CDatabase mDB;

	struct
	{
	    CDBQuery mInsertFolder;
	    CDBQuery mInsertKey;
	    CDBQuery mGetFolderID;
	    CDBQuery mGetChildren;
	    CDBQuery mGetKey;
	    CDBQuery mGetKeyNames;
	    CDBQuery mGetKeys;
	} mQueries;
};

#endif
